# 作者: 菅世博
# 2025年02月20日17时46分03秒
# 512326042@qq.com

# 1、多个缺省参数的传递练习，练习多个缺省参数（和上课保持一致即可）
def f1(a, b=1, c=2):
    print(a, b, c)


def f2(name, title='', age=18, gender=True):
    gender_text = '男生'
    if not gender:
        gender_text = '女生'
    print('%s%s 是 %s %s岁了' % (name, title, gender_text, age))


# 2.多值参数练习，元组，字典的传参拆包练习（和上课保持一致即可）
# 多值参数练习
def f3(name1, num, *args, **kwargs):
    print(name1, num, args, kwargs)


# 元祖练习
def f4(*args):
    for index, value in enumerate(args):  # enumerate() 用于将一个可遍历的数据对象（如列表、元组或字符串）组合为一个索引序列，同时列出数据和下标，一般用在 for 循环中
        print(f'元组第 {index + 1} 个元素: {value}')  # index + 1 表示下标从 1 开始


# 字典练习
# 进行字典的传参拆包练习
def f5(**kwargs):
    for key, value in kwargs.items():  # items() 以列表返回可遍历的(键、值)元组
        print(f'{key} : {value}')


# 3.设计一个类，实例化1个对象，会实现下面两种行为（和上课保持一致即可）
# 需求
# •一只 黄颜色 的 狗狗 叫 小黄
# •具有  汪汪叫 行为
# •具有  摇尾巴 行为
class Dog:
    def __init__(self, color, name):
        self.color = color
        self.name = name

    @staticmethod
    def bark(self):
        print('汪汪叫')

    @staticmethod
    def shake(self):
        print('摇尾巴')


# 4.练习封装案例（和上课保持一致即可）
class HouseItem:
    def __init__(self, name, area):
        """
        家具类
        :param name:
        :param area:
        """
        self.name = name
        self.area = area

    def __str__(self):
        return f'{self.name}占地{self.area}平方米'


class House:
    def __init__(self, house_type, area):
        self.house_type = house_type  # 房屋类型
        self.area = area  # 房屋面积
        self.free_area = area  # 剩余面积
        self.item_list = []  # 家具列表

    def __str__(self):  # __str__ 方法用于返回一个对象的描述信息,  在打印对象时，会自动调用
        return f'房屋类型：{self.house_type}，房屋面积：{self.area}平方米，剩余面积：{self.free_area}平方米'

    def add_item(self, item):
        if item.area < self.free_area:
            print(f'{item.name}添加成功')
            self.item_list.append(item)
            self.free_area -= item.area
        else:
            print(f'{item.name}添加失败，剩余面积不足')


#5、练习私有属性和私有方法（和上课保持一致即可）
class Person:
    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.__weight = weight

    def __secret(self):
        print(self.__weight)

    def boy_friend(self):
        self.__secret()


#6.练习单继承，多重继承案例（和上课保持一致即可）

# 练习单继承
class Animal:
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def eat(self):
        print('吃')

    def run(self):
        print('跑')

    def sleep(self):
        print('睡')

    def bark(self):
        print('叫')

class Dog2(Animal):

    def __init__(self, name, color):
        super().__init__(name, color)


    def bark(self):
        print(f'{self.name}bark')

class xiaotianquan(Dog2):
    weapon = '大剑'
    def __init__(self, name, color, weapon):
        super().__init__(name, color)
        self.weapon = weapon

    def fly(self):
        print(f'{self.name}fly')

class MusicPlayer2(object):
    instance = None
    init_flag = False

    def __new__(cls, *args, **kwargs):
        # 1. 判断类属性是否已经被赋值
        if cls.instance is None:
            cls.instance = super().__new__(cls)
        # 2. 返回类属性的单例引用
        return cls.instance

    def __init__(self):
        if not MusicPlayer2.init_flag:
            print('播放器初始化')
            MusicPlayer2.init_flag = True



if __name__ == '__main__':
    f1(1)
    f1(1, 2)
    f1(1, 2, 3)
    f2('小明', '班长', gender=False)
    print('-' * 20)
    f3('小明', 18, 1, 2, 3, 4, 5, name='xiaoming', age=18)
    print('-' * 20)
    f4(1, 2, 3, 4, 5)
    print('-' * 20)
    f5(name='xiaoming', age=18, gender='男')
    print('-' * 20)
    dog = Dog('黄色', '小黄')
    print(f'一只 {dog.color} 的狗狗 叫 {dog.name}')
    dog.bark(dog)
    dog.shake(dog)
    print('-' * 20)
    house = House('五室二厅', 200)
    bed = HouseItem('席梦思', 20)
    chest = HouseItem('衣柜', 10)
    table = HouseItem('餐桌', 30)
    house.add_item(bed)
    house.add_item(chest)
    house.add_item(table)
    print(house)
    print('-' * 20)
    person = Person('小红', 18, 50)
    print(f'{person.name}的年龄是{person.age}')
    person.boy_friend()
    print('-' * 20)
    dog = Dog2('大黄', 'yellow')
    print(dog.name)
    print(dog.color)
    print(xiaotianquan.weapon)
    print('-' * 20)
    player1 = MusicPlayer2()
    player2 = MusicPlayer2()
    print(id(player1) == id(player2))